💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    03 데이터 모델링 및 테이블 생성 | ✅ 편저: 코담 운영자

    3강 - 데이터 모델링 및 테이블 생성

    모델(테이블) 만들기, db 설명


    ✨ 이번 강의 목표

    • 데이터베이스 모델링 개념 이해
    • User, Post, Comment 모델 생성
    • 관계형 모델의 구조 설정 (1:N, N:M)
    • Django ORM을 활용한 모델 정의 익히기

    🧩 데이터 모델링 개념

    • 모델(Model): DB에 저장할 데이터를 정의하는 설계도 (스키마)
    • 스키마(Schema): 테이블 구조 정의서 (열/행, 필드/값, 관계 등)
    • 모델링(Modeling): 현실 세계의 객체를 DB에 구조화하는 작업

    📘 주요 용어 정리

    용어 설명
    테이블 객체 집합 (예: User, Post 등)
    행(Row) 하나의 데이터 레코드
    열(Column) 속성 또는 필드
    PK Primary Key. 고유 식별 필드
    FK Foreign Key. 다른 테이블 참조 필드

    👤 사용자 모델 (User)

    AbstractUser를 상속하여 사용자 모델을 확장합니다.

    from django.contrib.auth.models import AbstractUser
    from django.db import models
    from django.utils.translation import gettext_lazy as _
    from django.urls import reverse
    
    class User(AbstractUser):
        GENDER_CHOICES = (
            ('M', _('남성')),
            ('F', _('여성')),
            ('C', _('사용자 지정')),
        )
    
        name = models.CharField(_('사용자 이름'), blank=True, max_length=255)
        user_name = models.CharField(_('아이디'), blank=True, max_length=255)
        profile_photo = models.ImageField(_('프로필 사진'), blank=True, upload_to="profile_pics/")
        website = models.URLField(_('웹사이트'), blank=True, max_length=255)
        bio = models.TextField(_('소개'), blank=True)
        email = models.EmailField(_('이메일'), blank=False)
        phone_number = models.CharField(_('전화번호'), blank=True, max_length=20)
        gender = models.CharField(_('성별'), blank=True, choices=GENDER_CHOICES, max_length=5)
    
        followers = models.ManyToManyField(
            "self", verbose_name=_("팔로워"), symmetrical=False, related_name="user_followers", blank=True
        )
        following = models.ManyToManyField(
            "self", verbose_name=_("팔로잉"), symmetrical=False, related_name="user_following", blank=True
        )
    
        def get_absolute_url(self):
            return reverse("users:detail", kwargs={"username": self.username})
    

    symmetrical=False로 단방향 팔로우 관계 구현 가능


    🕒 공통 모델 (TimeStampedModel)

    class TimeStampedModel(models.Model):
        created_at = models.DateTimeField(_('생성일'), auto_now_add=True)
        updated_at = models.DateTimeField(_('수정일'), auto_now=True)
    
        class Meta:
            abstract = True
    

    생성일·수정일 자동 저장. abstract = True 설정으로 단독 테이블로 생성되지 않음


    📸 게시글 모델 (Post)

    class Post(TimeStampedModel):
        author = models.ForeignKey(
            'users.User', null=True, on_delete=models.CASCADE,
            related_name='post_author', verbose_name=_('작성자')
        )
        image = models.ImageField(_('이미지'), upload_to='posts/', blank=False)
        caption = models.TextField(_('내용'), blank=False)
        image_likes = models.ManyToManyField(
            'users.User', blank=True, related_name='post_image_likes', verbose_name=_('좋아요')
        )
    
        def __str__(self):
            return f"{self.author} : {self.caption}"
    
        class Meta:
            verbose_name = _('게시물')
            verbose_name_plural = _('게시물들')
            ordering = ['-created_at']
    

    image_likes는 게시글과 유저 간 다대다 관계 (좋아요 기능)


    💬 댓글 모델 (Comment)

    class Comment(TimeStampedModel):
        author = models.ForeignKey(
            'users.User', null=True, on_delete=models.CASCADE,
            related_name='comment_author', verbose_name=_('작성자')
        )
        post = models.ForeignKey(
            Post, null=True, on_delete=models.CASCADE,
            related_name='comment_post', verbose_name=_('게시물')
        )
        contents = models.TextField(_('내용'), blank=True)
    
        def __str__(self):
            return f"{self.author} : {self.contents[:20]}"
    
        class Meta:
            verbose_name = _('댓글')
            verbose_name_plural = _('댓글들')
            ordering = ['-created_at']
    

    🔁 모델 간 관계 요약

    관계 설명
    User ↔ User 팔로우/팔로잉 (N:M)
    User → Post 작성자 (1:N)
    User → Comment 댓글 작성자 (1:N)
    Post → Comment 게시글의 댓글 (1:N)
    Post ↔ User 좋아요 (N:M)

    ⚙️ 마이그레이션 및 오류 대응

    python manage.py makemigrations
    python manage.py migrate
    

    🔧 마이그레이션 오류 시 조치

    1. 기존 마이그레이션 및 DB 초기화:
    rm -rf users/migrations/*
    rm -rf posts/migrations/*
    rm db.sqlite3  # SQLite 사용하는 경우에만
    
    1. 앱 등록 확인: settings/base.py
    LOCAL_APPS = [
        "django_instagram.users",
        "django_instagram.posts",
    ]
    
    1. 앱별 마이그레이션 실행:
    python manage.py makemigrations users
    python manage.py makemigrations posts
    python manage.py migrate
    
    1. django.contrib.sites 관련 오류:
    # "django.contrib.sites",
    

    단일 사이트 환경이라면 사이트 프레임워크는 비활성화해도 무방합니다.


    ✅ 정리

    • 데이터 모델링은 현실 데이터를 구조화하는 핵심 작업
    • 사용자, 게시물, 댓글 간의 관계를 Django 모델로 정의
    • TimeStampedModel을 통해 공통 필드 관리
    • 마이그레이션 및 필드 오류 발생 시 조치법 숙지

    다음 강의에서는 사용자 인증 기능과 프론트 화면 구현으로 이어집니다.

    TOP
    preload preload